home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Special 23
/
AMIGAplus Sonderheft 23 (2000)(Falke)(DE)[!].iso
/
Updates
/
Datatypes
/
PCD-DT35
/
Source
/
libbase.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-11-14
|
3KB
|
185 lines
#include <clib/alib_protos.h>
#include <pragma/exec_lib.h>
#include <pragma/intuition_lib.h>
#include <dos/dos.h>
#include <exec/resident.h>
#define VERSION 44
#define REVISION 0
struct ClassBase:Library
{
BPTR cb_SegList;
IClass *cb_Class;
SignalSemaphore cb_Lock;
};
extern APTR Dispatcher;
extern ULONG InitTab[];
extern APTR LibVectors[];
extern char LibName[];
extern char LibId[];
Library *LibInit(register __a0 ULONG Segment,register __d0 ClassBase *cb,register __a6 Library *sysbase);
Library *LibOpen(register __a6 ClassBase *cb);
ULONG LibClose(register __a6 ClassBase *cb);
ULONG LibExpunge(register __a6 ClassBase *cb);
IClass *ObtainClass(register __a6 ClassBase *cb);
BOOL L_OpenLibs();
void L_CloseLibs();
IClass *InitClass(ClassBase *cb);
static LONG LibExtFunc()
{
return -1;
}
static Resident RomTag=
{
RTC_MATCHWORD,
&RomTag,
&RomTag+sizeof(RomTag),
RTF_AUTOINIT,
VERSION,
NT_LIBRARY,
0,
LibName,
LibId,
&InitTab
};
char LibName[]="pcd.datatype";
char LibId[]="$VER:pcd.datatype 44.0 (13.11.99) © 1997-99 by Achim Stegemann\n";
ULONG InitTab[]=
{
sizeof(ClassBase),
ULONG(LibVectors),
0,
ULONG(LibInit)
};
APTR LibVectors[]=
{
LibOpen,
LibClose,
LibExpunge,
LibExtFunc,
ObtainClass,
APTR(-1),
};
Library *SysBase;
Library *DOSBase;
Library *IntuitionBase;
Library *GfxBase;
Library *UtilityBase;
Library *DataTypesBase;
Library *SuperClassBase;
Library *LibInit(register __a0 ULONG Segment,register __d0 ClassBase *cb,register __a6 Library *sysbase)
{
SysBase=sysbase;
cb->lib_Revision=REVISION;
cb->cb_SegList=Segment;
InitSemaphore(&cb->cb_Lock);
return cb;
}
Library *LibOpen(register __a6 ClassBase *cb)
{
Library *ret=0;
cb->lib_Flags&=~LIBF_DELEXP;
ObtainSemaphore(&cb->cb_Lock);
if(!cb->cb_Class)
{
if(L_OpenLibs())
{
if(cb->cb_Class=InitClass(cb)) ret=cb;
}
}
else ret=cb;
if(ret) cb->lib_OpenCnt++;
ReleaseSemaphore(&cb->cb_Lock);
return ret;
}
ULONG LibClose(register __a6 ClassBase *cb)
{
if(cb->lib_OpenCnt) cb->lib_OpenCnt--;
return (!cb->lib_OpenCnt&&cb->lib_Flags&LIBF_DELEXP)?LibExpunge(cb):0;
}
ULONG LibExpunge(register __a6 ClassBase *cb)
{
if(!cb->lib_OpenCnt)
{
if(cb->cb_Class)
{
if(!FreeClass(cb->cb_Class))
{
AddClass(cb->cb_Class);
return 0;
}
}
L_CloseLibs();
Remove(cb);
FreeMem((BYTE *)cb-cb->lib_NegSize,cb->lib_NegSize+cb->lib_PosSize);
return cb->cb_SegList;
}
else cb->lib_Flags|=LIBF_DELEXP;
return 0;
}
BOOL L_OpenLibs()
{
if(DOSBase=OpenLibrary("dos.library",40))
{
if(GfxBase=OpenLibrary("graphics.library",40))
{
if(IntuitionBase=OpenLibrary("intuition.library",40))
{
if(UtilityBase=OpenLibrary("utility.library",40))
{
if(DataTypesBase=OpenLibrary("datatypes.library",44))
{
if(SuperClassBase=OpenLibrary("datatypes/picture.datatype",44)) return 1;
}
}
}
}
}
L_CloseLibs();
return 0;
}
void L_CloseLibs()
{
CloseLibrary(DOSBase);
CloseLibrary(IntuitionBase);
CloseLibrary(GfxBase);
CloseLibrary(UtilityBase);
CloseLibrary(DataTypesBase);
CloseLibrary(SuperClassBase);
}
IClass *InitClass(ClassBase *cb)
{
IClass *cl;
if(cl=MakeClass(LibName,"picture.datatype",0,0,0))
{
cl->h_Entry=&HookEntry;
cl->h_SubEntry=&Dispatcher;
cl->cl_UserData=ULONG(cb);
AddClass(cl);
}
return cl;
}
IClass *ObtainClass(register __a6 ClassBase *cb)
{
return cb->cb_Class;
}